IF EXISTS (SELECT * FROM SYSOBJECTS WHERE name='spRpt_ControlEjecucionPPTO' and XTYPE='P')
BEGIN
	DROP PROCEDURE [dbo].[spRpt_ControlEjecucionPPTO]
END
GO
CREATE PROCEDURE [dbo].[spRpt_ControlEjecucionPPTO]
	 @OP VARCHAR(64)=NULL
	,@ParamAuxiliar NVARCHAR(MAX)=NULL   /* PARAMETRO AUXILIAR */
	,@PeriodoSuperior VARCHAR(6)=NULL
	,@CodCentroCosto_Ini VARCHAR(16)=NULL
	,@CodCentroCosto_Fin VARCHAR(16)=NULL
WITH ENCRYPTION
AS
SET NOCOUNT ON
BEGIN TRY

/**** VERIFICAR SI LA SESSION DE USUARIO ESTA ACTIVA ****/
-----EXEC SP_ExecuteSQL N'dbo.spSeguridadUsuario @OP=''VerificarSessionActiva'''
/**** FIN - VERIFICAR SI LA SESSION DE USUARIO ESTA ACTIVA ****/--DECLARE @ERROR VARCHAR(500)

----------------
-- DECLARACIONES
----------------
declare @aux nvarchar(512)
declare @CodPresupuesto varchar(6)
declare @PeriodoEnLetras VARCHAR(128)  --- ejemplo: Noviembre del 2012
declare @JefeDivisionCostosYPresupuesto VARCHAR(128)
declare @JefeDepartamentoFinanzas VARCHAR(128)

--- En esta tabla se grabaran las ejecuciones En los COMPROMISOS
declare @tablaEjecCompromisos table(
	 codPresupuesto varchar(6)
	,CodCentroCosto varchar(16)
	,CodRubro varchar(16)
	,VrEjecucion decimal(18,3)
	,VrEjecucionMes decimal(18,3)
)
--- En esta tabla se grabaran los valores facturados, es decir los valores de los registros contables que se han cruzado con los compromisos
declare @tablaEjecRegistros table(
	 codPresupuesto varchar(6)
	,CodCentroCosto varchar(16)
	,CodRubro varchar(16)
	,VrEjecucion decimal(18,3)
	,VrEjecucionMes decimal(18,3)
)
--- En esta tabla se grabaran los movimientos presupuestales
declare @tablaMovPresupuestales table(
	 codPresupuesto varchar(6)
	,CodCentroCosto varchar(16)
	,CodRubro varchar(16)
	,VrMovimiento decimal(18,3)
)
--- Tabla con los datos basicos de los rubros del presupuesto
declare @tablaDetallePresupuesto TABLE(
	 codPresupuesto varchar(6)
	,CodCentroCosto varchar(16)
	,CodTipoRubro varchar(16)
	,CodRubro varchar(16)
	,VrIniPres_Rubro decimal(18,3)
	,NombreCentroCosto varchar(256)
	,NombreTipoRubro varchar(256)
	,NombreRubro varchar(256)	
)

IF EXISTS (SELECT NAME FROM tempdb..sysobjects WHERE name LIKE '##tablaResultado%' AND XTYPE='U')
BEGIN
	DROP TABLE [##tablaResultado]
END	
	
--- Tabla EN LA SE GRABAN LOS RESULTADOS DE LA CONSULTA
CREATE TABLE ##tablaResultado (
	 id int identity(1,1)
	,codPresupuesto varchar(16)
	,CodCentroCosto varchar(16)
	,NombreCentroCosto varchar(256)
    ,CodTipoRubro varchar(16)
	,NombreTipoRubro varchar(256)
    ,CodRubro varchar(16)
	,NombreRubro varchar(256)
	-- Analisis Mensual (REGISTROS)
    ,VrPPTO_Mes decimal(18,3) DEFAULT 0
    ,VrEjecRegisRubro_Mes decimal(18,3) DEFAULT 0
    ,PorcCumplimiento_Mes decimal(18,3) DEFAULT 0
    -- PRESUPUESTO $
    ,VrPPTO_Anio decimal(18,3) DEFAULT 0
    -- Analisis Anual (COMPROMISOS)
    ,Vr_EjecComprRubro_Anio decimal(18,3) DEFAULT 0
    ,Porc_EjecCompr_Anio decimal(18,3) DEFAULT 0
    ,Vr_PorEjecComprRubro_Anio decimal(18,3) DEFAULT 0
    ,Porc_PorEjecCompr_Anio decimal(18,3) DEFAULT 0
    -- Analisis Anual (REGISTROS)
    ,Vr_EjecRegisRubro_Anio decimal(18,3) DEFAULT 0
    ,Porc_EjecRegis_Anio decimal(18,3) DEFAULT 0
    ,Vr_PorEjecRegisRubro_Anio decimal(18,3) DEFAULT 0
    ,Porc_PorEjecRegis_Anio decimal(18,3) DEFAULT 0
    ,REGISTRO_AGRUPADO BIT NOT NULL DEFAULT 0 --- ESTE CAMPO ES SUPER IMPORTANTE, CON ESTE CAMPO SE DIFERENCIARAN LOS REGISTROS AGRUPADOS DE  LOS NO AGRUPADOS

)

/*****     IMPRIMIR  REPORTE GENERAL  *****/
IF @OP = 'Imprimir_GENERAL'
BEGIN
	--Obtener y analizar la informacion (A continuacion invoco el @OP='ObtenerYAnalizarInformacion' de este mismo Procedimiento Almacenado para obtener y analizar la informacion necesaria)
	SET @AUX='EXEC '+OBJECT_NAME(@@PROCID)+' @OP=''ObtenerYAnalizarInformacion'', @ParamAuxiliar='''+ISNULL(@ParamAuxiliar,'')+''', @PeriodoSuperior='''+ISNULL(@PeriodoSuperior,'')+''',@CodCentroCosto_Ini='''+ISNULL(@CodCentroCosto_Ini,'')+''',@CodCentroCosto_Fin='''+ISNULL(@CodCentroCosto_Fin,'')+''''
	EXEC sp_executesql @AUX
	
	-- Formateo el @Periodo para que se muestre en el reporte como el usuario final lo soclicito, ejemplo: Febrero del 2012,Marzo del 2013, etc...
	SET @aux=
		CASE 
			WHEN Substring(@PeriodoSuperior,5,2)='01' THEN 'ENERO DEL '+Substring(@PeriodoSuperior,1,4)
			WHEN Substring(@PeriodoSuperior,5,2)='02' THEN 'FEBRERO DEL '+Substring(@PeriodoSuperior,1,4)
			WHEN Substring(@PeriodoSuperior,5,2)='03' THEN 'MARZO DEL '+Substring(@PeriodoSuperior,1,4)
			WHEN Substring(@PeriodoSuperior,5,2)='04' THEN 'ABRIL DEL '+Substring(@PeriodoSuperior,1,4)
			WHEN Substring(@PeriodoSuperior,5,2)='05' THEN 'MAYO DEL '+Substring(@PeriodoSuperior,1,4)
			WHEN Substring(@PeriodoSuperior,5,2)='06' THEN 'JUNIO DEL '+Substring(@PeriodoSuperior,1,4)
			WHEN Substring(@PeriodoSuperior,5,2)='07' THEN 'JULIO DEL '+Substring(@PeriodoSuperior,1,4)
			WHEN Substring(@PeriodoSuperior,5,2)='08' THEN 'AGOSTO DEL '+Substring(@PeriodoSuperior,1,4)
			WHEN Substring(@PeriodoSuperior,5,2)='09' THEN 'SEPTIEMBRE DEL '+Substring(@PeriodoSuperior,1,4)
			WHEN Substring(@PeriodoSuperior,5,2)='10' THEN 'OCTUBRE DEL '+Substring(@PeriodoSuperior,1,4)
			WHEN Substring(@PeriodoSuperior,5,2)='11' THEN 'NOVIEMBRE DEL '+Substring(@PeriodoSuperior,1,4)
			WHEN Substring(@PeriodoSuperior,5,2)='12' THEN 'DICIEMBRE DEL '+Substring(@PeriodoSuperior,1,4)
		END
	
	-- Obtengo las firmas que se mostraran en el reporte
	SELECT @JefeDivisionCostosYPresupuesto=Valor FROM SeguridadParametro WHERE CodParametro='JefeDivisionCostosYPresupuesto'
	SELECT @JefeDepartamentoFinanzas=Valor FROM SeguridadParametro WHERE CodParametro='JefeDepartamentoFinanzas'
	
	--select * from ##tablaResultado res 
	-----------
	-- RETORNAR
	-----------
	
	select 
		 res.codPresupuesto
		,res.CodCentroCosto
		,res.NombreCentroCosto
		,res.CodTipoRubro
		,res.NombreTipoRubro
		,res.CodRubro
		,res.NombreRubro
		,res.VrPPTO_Mes
		,res.VrEjecRegisRubro_Mes
		,res.PorcCumplimiento_Mes
		-- PRESUPUESTO $
		,res.VrPPTO_Anio
		-- Analisis Anual (COMPROMISOS)
		,res.Vr_EjecComprRubro_Anio
		,res.Porc_EjecCompr_Anio
		,res.Vr_PorEjecComprRubro_Anio
		,res.Porc_PorEjecCompr_Anio
		-- Analisis Anual (REGISTROS)
		,res.Vr_EjecRegisRubro_Anio
		,res.Porc_EjecRegis_Anio
		,res.Vr_PorEjecRegisRubro_Anio
		,res.Porc_PorEjecRegis_Anio
		,case when res.Vr_EjecComprRubro_Anio<>0 then 100 * res.Vr_EjecRegisRubro_Anio/res.Vr_EjecComprRubro_Anio else 0 end as Porc_EjecRegisYEjecCompr
		,@AUX as Periodo
		,@JefeDivisionCostosYPresupuesto AS JefeDivisionCostosYPresupuesto
		,@JefeDepartamentoFinanzas AS JefeDepartamentoFinanzas
		,'IMPRESO POR: '+dbo.fnGetUsuarioSession() as UsuarioImpresion 
	from 
		##tablaResultado res 
		INNER JOIN Rubro r
			on res.CodRubro=r.CodRubro
		INNER JOIN RubroTipo rt
			on res.CodTipoRubro=rt.CodTipo
	where
		res.CodCentroCosto between @CodCentroCosto_Ini and @CodCentroCosto_Fin
	ORDER BY 
		 res.codPresupuesto
		,res.CodCentroCosto
		,rt.Orden
		,r.Orden

RETURN 0
END

/*****     IMPRIMIR  REPORTE CONSOLIDIDADO COTECMAR  *****/
IF @OP = 'Imprimir_COTECMAR'
BEGIN	
	--Obtener y analizar la informacion (A continuacion invoco el @OP='ObtenerYAnalizarInformacion' de este mismo SP, para obtener y analizar la informacion necesaria)
	SET @AUX='EXEC '+OBJECT_NAME(@@PROCID)+' @OP=''ObtenerYAnalizarInformacion'', @ParamAuxiliar='''+ISNULL(@ParamAuxiliar,'')+''', @PeriodoSuperior='''+ISNULL(@PeriodoSuperior,'')+''',@CodCentroCosto_Ini='''+ISNULL(@CodCentroCosto_Ini,'')+''',@CodCentroCosto_Fin='''+ISNULL(@CodCentroCosto_Fin,'')+''''
	EXEC sp_executesql @AUX
	
	-- Formateo el @Periodo para que se muestre en el reporte como el usuario final lo soclicito, ejemplo: Febrero del 2012,Marzo del 2013, etc...
	SET @AUX=
		CASE 
			WHEN Substring(@PeriodoSuperior,5,2)='01' THEN 'ENERO DEL '+Substring(@PeriodoSuperior,1,4)
			WHEN Substring(@PeriodoSuperior,5,2)='02' THEN 'FEBRERO DEL '+Substring(@PeriodoSuperior,1,4)
			WHEN Substring(@PeriodoSuperior,5,2)='03' THEN 'MARZO DEL '+Substring(@PeriodoSuperior,1,4)
			WHEN Substring(@PeriodoSuperior,5,2)='04' THEN 'ABRIL DEL '+Substring(@PeriodoSuperior,1,4)
			WHEN Substring(@PeriodoSuperior,5,2)='05' THEN 'MAYO DEL '+Substring(@PeriodoSuperior,1,4)
			WHEN Substring(@PeriodoSuperior,5,2)='06' THEN 'JUNIO DEL '+Substring(@PeriodoSuperior,1,4)
			WHEN Substring(@PeriodoSuperior,5,2)='07' THEN 'JULIO DEL '+Substring(@PeriodoSuperior,1,4)
			WHEN Substring(@PeriodoSuperior,5,2)='08' THEN 'AGOSTO DEL '+Substring(@PeriodoSuperior,1,4)
			WHEN Substring(@PeriodoSuperior,5,2)='09' THEN 'SEPTIEMBRE DEL '+Substring(@PeriodoSuperior,1,4)
			WHEN Substring(@PeriodoSuperior,5,2)='10' THEN 'OCTUBRE DEL '+Substring(@PeriodoSuperior,1,4)
			WHEN Substring(@PeriodoSuperior,5,2)='11' THEN 'NOVIEMBRE DEL '+Substring(@PeriodoSuperior,1,4)
			WHEN Substring(@PeriodoSuperior,5,2)='12' THEN 'DICIEMBRE DEL '+Substring(@PeriodoSuperior,1,4)
		END
	
	-- Obtengo las firmas que se mostraran en el reporte
	SELECT @JefeDivisionCostosYPresupuesto=Valor FROM SeguridadParametro WHERE CodParametro='JefeDivisionCostosYPresupuesto'
	SELECT @JefeDepartamentoFinanzas=Valor FROM SeguridadParametro WHERE CodParametro='JefeDepartamentoFinanzas'
		
	--- AGRUPO LA INFORMACION POR RUBROS!!!!
	INSERT INTO ##tablaResultado
		(
			 codPresupuesto
			,CodCentroCosto
			,NombreCentroCosto
			,CodTipoRubro
			,NombreTipoRubro
			,CodRubro
			,NombreRubro
			,VrPPTO_Mes
			,VrEjecRegisRubro_Mes
			,PorcCumplimiento_Mes
			-- PRESUPUESTO $
			,VrPPTO_Anio
			-- Analisis Anual (COMPROMISOS)
			,Vr_EjecComprRubro_Anio
			,Porc_EjecCompr_Anio
			,Vr_PorEjecComprRubro_Anio
			,Porc_PorEjecCompr_Anio
			-- Analisis Anual (REGISTROS)
			,Vr_EjecRegisRubro_Anio
			,Porc_EjecRegis_Anio
			,Vr_PorEjecRegisRubro_Anio
			,Porc_PorEjecRegis_Anio
			,REGISTRO_AGRUPADO
		)
		select 
			 codPresupuesto
			,'COTECMAR' AS CodCentroCosto--,CodCentroCosto
			,'COTECMAR' AS NombreCentroCosto--,NombreCentroCosto
			,CodTipoRubro
			,NombreTipoRubro
			,CodRubro
			,NombreRubro
			,SUM(VrPPTO_Mes) AS VrPPTO_Mes
			,SUM(VrEjecRegisRubro_Mes) AS VrEjecRegisRubro_Mes
			,CASE WHEN SUM(VrPPTO_Mes)<>0 THEN 100 * SUM(VrEjecRegisRubro_Mes)/SUM(VrPPTO_Mes) ELSE 0 END AS PorcCumplimiento_Mes
			-- PRESUPUESTO $
			,SUM(VrPPTO_Anio) AS VrPPTO_Anio
			-- Analisis Anual (COMPROMISOS)
			,SUM(Vr_EjecComprRubro_Anio) AS Vr_EjecComprRubro_Anio
			,CASE WHEN SUM(VrPPTO_Anio)<>0 THEN 100 * SUM(Vr_EjecComprRubro_Anio)/SUM(VrPPTO_Anio) ELSE 0 END AS Porc_EjecCompr_Anio
			,SUM(Vr_PorEjecComprRubro_Anio) AS Vr_PorEjecComprRubro_Anio
			,CASE WHEN SUM(VrPPTO_Anio)<>0 THEN 100 * SUM(Vr_PorEjecComprRubro_Anio)/SUM(VrPPTO_Anio) ELSE 0 END AS Porc_PorEjecCompr_Anio
			-- Analisis Anual (REGISTROS)
			,SUM(Vr_EjecRegisRubro_Anio) AS Vr_EjecRegisRubro_Anio
			,CASE WHEN SUM(VrPPTO_Anio)<>0 THEN 100 * SUM(Vr_EjecRegisRubro_Anio)/SUM(VrPPTO_Anio) ELSE 0 END AS Porc_EjecRegis_Anio
			,SUM(Vr_PorEjecRegisRubro_Anio) AS Vr_PorEjecRegisRubro_Anio
			,CASE WHEN SUM(VrPPTO_Anio)<>0 THEN 100 * SUM(Vr_PorEjecRegisRubro_Anio)/SUM(VrPPTO_Anio) ELSE 0 END AS Porc_PorEjecRegis_Anio
			,1
		from
			##tablaResultado res
		where
			res.CodCentroCosto <> '000000'
		group by
			 codPresupuesto
			--,CodCentroCosto
			--,NombreCentroCosto
			,CodTipoRubro
			,NombreTipoRubro
			,CodRubro
			,NombreRubro
			
		-- Borro los registro que no han sido agrupados
		delete from ##tablaResultado where REGISTRO_AGRUPADO=0
	
	-----------
	-- RETORNAR
	-----------
	
	select 
		 res.codPresupuesto
		,res.CodCentroCosto
		,res.NombreCentroCosto
		,res.CodTipoRubro
		,res.NombreTipoRubro
		,res.CodRubro
		,res.NombreRubro		
		,res.VrPPTO_Mes
		,res.VrEjecRegisRubro_Mes
		,res.PorcCumplimiento_Mes
		-- PRESUPUESTO $
		,res.VrPPTO_Anio
		-- Analisis Anual (COMPROMISOS)
		,res.Vr_EjecComprRubro_Anio
		,res.Porc_EjecCompr_Anio
		,res.Vr_PorEjecComprRubro_Anio
		,res.Porc_PorEjecCompr_Anio
		-- Analisis Anual (REGISTROS)
		,res.Vr_EjecRegisRubro_Anio
		,res.Porc_EjecRegis_Anio
		,res.Vr_PorEjecRegisRubro_Anio
		,res.Porc_PorEjecRegis_Anio
		,case when res.Vr_EjecComprRubro_Anio<>0 then 100 * res.Vr_EjecRegisRubro_Anio/res.Vr_EjecComprRubro_Anio else 0 end as Porc_EjecRegisYEjecCompr
		,@AUX as Periodo
		,@JefeDivisionCostosYPresupuesto AS JefeDivisionCostosYPresupuesto
		,@JefeDepartamentoFinanzas AS JefeDepartamentoFinanzas
		,'IMPRESO POR: '+dbo.fnGetUsuarioSession() as UsuarioImpresion 
	from 
		##tablaResultado res 
		INNER JOIN Rubro r
			on res.CodRubro=r.CodRubro
		INNER JOIN RubroTipo rt
			on res.CodTipoRubro=rt.CodTipo
	--where
	--	res.CodCentroCosto between @CodCentroCosto_Ini and @CodCentroCosto_Fin
	ORDER BY 
		 res.codPresupuesto
		,res.CodCentroCosto
		,rt.Orden
		,r.Orden

RETURN 0
END

/*****     IMPRIMIR  REPORTE CONSOLIDIDADO POR DIRECCIONES  *****/
IF @OP = 'Imprimir_DIRECCIONES'
BEGIN	
	--Obtener y analizar la informacion (A continuacion invoco el @OP='ObtenerYAnalizarInformacion' de este mismo SP, para obtener y analizar la informacion necesaria)
	SET @AUX='EXEC '+OBJECT_NAME(@@PROCID)+' @OP=''ObtenerYAnalizarInformacion'', @ParamAuxiliar='''+ISNULL(@ParamAuxiliar,'')+''', @PeriodoSuperior='''+ISNULL(@PeriodoSuperior,'')+''',@CodCentroCosto_Ini='''+ISNULL(@CodCentroCosto_Ini,'')+''',@CodCentroCosto_Fin='''+ISNULL(@CodCentroCosto_Fin,'')+''''
	EXEC sp_executesql @AUX
	
	-- Formateo el @Periodo para que se muestre en el reporte como el usuario final lo soclicito, ejemplo: Febrero del 2012,Marzo del 2013, etc...
	SET @Aux=
		CASE 
			WHEN Substring(@PeriodoSuperior,5,2)='01' THEN 'ENERO DEL '+Substring(@PeriodoSuperior,1,4)
			WHEN Substring(@PeriodoSuperior,5,2)='02' THEN 'FEBRERO DEL '+Substring(@PeriodoSuperior,1,4)
			WHEN Substring(@PeriodoSuperior,5,2)='03' THEN 'MARZO DEL '+Substring(@PeriodoSuperior,1,4)
			WHEN Substring(@PeriodoSuperior,5,2)='04' THEN 'ABRIL DEL '+Substring(@PeriodoSuperior,1,4)
			WHEN Substring(@PeriodoSuperior,5,2)='05' THEN 'MAYO DEL '+Substring(@PeriodoSuperior,1,4)
			WHEN Substring(@PeriodoSuperior,5,2)='06' THEN 'JUNIO DEL '+Substring(@PeriodoSuperior,1,4)
			WHEN Substring(@PeriodoSuperior,5,2)='07' THEN 'JULIO DEL '+Substring(@PeriodoSuperior,1,4)
			WHEN Substring(@PeriodoSuperior,5,2)='08' THEN 'AGOSTO DEL '+Substring(@PeriodoSuperior,1,4)
			WHEN Substring(@PeriodoSuperior,5,2)='09' THEN 'SEPTIEMBRE DEL '+Substring(@PeriodoSuperior,1,4)
			WHEN Substring(@PeriodoSuperior,5,2)='10' THEN 'OCTUBRE DEL '+Substring(@PeriodoSuperior,1,4)
			WHEN Substring(@PeriodoSuperior,5,2)='11' THEN 'NOVIEMBRE DEL '+Substring(@PeriodoSuperior,1,4)
			WHEN Substring(@PeriodoSuperior,5,2)='12' THEN 'DICIEMBRE DEL '+Substring(@PeriodoSuperior,1,4)
		END
	
	-- Obtengo las firmas que se mostraran en el reporte
	SELECT @JefeDivisionCostosYPresupuesto=Valor FROM SeguridadParametro WHERE CodParametro='JefeDivisionCostosYPresupuesto'
	SELECT @JefeDepartamentoFinanzas=Valor FROM SeguridadParametro WHERE CodParametro='JefeDepartamentoFinanzas'
	
	--- AGRUPO LA INFORMACION POR DIRECCIONES!!!!
	INSERT INTO ##tablaResultado
		(
			 codPresupuesto
			,CodCentroCosto
			,NombreCentroCosto
			,CodTipoRubro
			,NombreTipoRubro
			,CodRubro
			,NombreRubro
			,VrPPTO_Mes
			,VrEjecRegisRubro_Mes
			,PorcCumplimiento_Mes
			-- PRESUPUESTO $
			,VrPPTO_Anio
			-- Analisis Anual (COMPROMISOS)
			,Vr_EjecComprRubro_Anio
			,Porc_EjecCompr_Anio
			,Vr_PorEjecComprRubro_Anio
			,Porc_PorEjecCompr_Anio
			-- Analisis Anual (REGISTROS)
			,Vr_EjecRegisRubro_Anio
			,Porc_EjecRegis_Anio
			,Vr_PorEjecRegisRubro_Anio
			,Porc_PorEjecRegis_Anio
			,REGISTRO_AGRUPADO
		)
		select 
			 codPresupuesto
			,CodCentroCosto
			,NombreCentroCosto
			,'' AS CodTipoRubro	--,CodTipoRubro
			,'' AS NombreTipoRubro	--,NombreTipoRubro
			,'' AS CodRubro	--,CodRubro
			,'' AS NombreRubro	--,NombreRubro
			,SUM(VrPPTO_Mes) AS VrPPTO_Mes
			,SUM(VrEjecRegisRubro_Mes) AS VrEjecRegisRubro_Mes
			,CASE WHEN SUM(VrPPTO_Mes)<>0 THEN 100 * SUM(VrEjecRegisRubro_Mes)/SUM(VrPPTO_Mes) ELSE 0 END AS PorcCumplimiento_Mes
			-- PRESUPUESTO $
			,SUM(VrPPTO_Anio) AS VrPPTO_Anio
			-- Analisis Anual (COMPROMISOS)
			,SUM(Vr_EjecComprRubro_Anio) AS Vr_EjecComprRubro_Anio
			,CASE WHEN SUM(VrPPTO_Anio)<>0 THEN 100 * SUM(Vr_EjecComprRubro_Anio)/SUM(VrPPTO_Anio) ELSE 0 END AS Porc_EjecCompr_Anio
			,SUM(Vr_PorEjecComprRubro_Anio) AS Vr_PorEjecComprRubro_Anio
			,CASE WHEN SUM(VrPPTO_Anio)<>0 THEN 100 * SUM(Vr_PorEjecComprRubro_Anio)/SUM(VrPPTO_Anio) ELSE 0 END AS Porc_PorEjecCompr_Anio
			-- Analisis Anual (REGISTROS)
			,SUM(Vr_EjecRegisRubro_Anio) AS Vr_EjecRegisRubro_Anio
			,CASE WHEN SUM(VrPPTO_Anio)<>0 THEN 100 * SUM(Vr_EjecRegisRubro_Anio)/SUM(VrPPTO_Anio) ELSE 0 END AS Porc_EjecRegis_Anio
			,SUM(Vr_PorEjecRegisRubro_Anio) AS Vr_PorEjecRegisRubro_Anio
			,CASE WHEN SUM(VrPPTO_Anio)<>0 THEN 100 * SUM(Vr_PorEjecRegisRubro_Anio)/SUM(VrPPTO_Anio) ELSE 0 END AS Porc_PorEjecRegis_Anio
			,1
		from
			##tablaResultado 
		group by
			 codPresupuesto
			,CodCentroCosto
			,NombreCentroCosto
			--,CodTipoRubro
			--,NombreTipoRubro
			--,CodRubro
			--,NombreRubro
		
		-- Borro los registro que no han sido agrupados
		delete from ##tablaResultado where REGISTRO_AGRUPADO=0
	
	-----------
	-- RETORNAR
	-----------
	
	select 
		 res.codPresupuesto
		,res.CodCentroCosto
		,res.NombreCentroCosto
		,res.CodTipoRubro
		,res.NombreTipoRubro
		,res.CodRubro
		,res.NombreRubro		
		,res.VrPPTO_Mes
		,res.VrEjecRegisRubro_Mes
		,res.PorcCumplimiento_Mes
		-- PRESUPUESTO $
		,res.VrPPTO_Anio
		-- Analisis Anual (COMPROMISOS)
		,res.Vr_EjecComprRubro_Anio
		,res.Porc_EjecCompr_Anio
		,res.Vr_PorEjecComprRubro_Anio
		,res.Porc_PorEjecCompr_Anio
		-- Analisis Anual (REGISTROS)
		,res.Vr_EjecRegisRubro_Anio
		,res.Porc_EjecRegis_Anio
		,res.Vr_PorEjecRegisRubro_Anio
		,res.Porc_PorEjecRegis_Anio
		,case when res.Vr_EjecComprRubro_Anio<>0 then 100 * res.Vr_EjecRegisRubro_Anio/res.Vr_EjecComprRubro_Anio else 0 end as Porc_EjecRegisYEjecCompr
		,@AUX as Periodo
		,@JefeDivisionCostosYPresupuesto AS JefeDivisionCostosYPresupuesto
		,@JefeDepartamentoFinanzas AS JefeDepartamentoFinanzas
		,'IMPRESO POR: '+dbo.fnGetUsuarioSession() as UsuarioImpresion 
	from 
		##tablaResultado res 
	where
		res.CodCentroCosto between @CodCentroCosto_Ini and @CodCentroCosto_Fin
	ORDER BY 
		 res.codPresupuesto
		,res.CodCentroCosto
	
RETURN 0
END

/*****     Esta operacion Obtiene y analiza toda la informacion contenida en el sistema necesaria para generar los reportes que se requieren  *****/
IF @OP = 'ObtenerYAnalizarInformacion'
BEGIN

	---------------
	-- VALIDACIONES
	---------------

	-- verifico que el periodo sea correcto
	SELECT @PeriodoSuperior=LEFT(ISNULL(@PeriodoSuperior,'')+REPLICATE('0',6),6)
	if isdate(CONVERT(DATETIME,SUBSTRING(@PeriodoSuperior,1,4)+'/'+SUBSTRING(@PeriodoSuperior,5,2)+'/20',111))=0
	BEGIN 
		SET @AUX='El periodo '+@PeriodoSuperior+' Es incorrecto'	
		RAISERROR(@AUX,16,1);
		return
	END

	-- Obtengo el presupuesto del periodo
	SELECT @CodPresupuesto=CodPresupuesto FROM PresupuestoAnualCabecera WHERE Vigencia=SUBSTRING(@PeriodoSuperior,1,4)

	-- Verifico que el periodo exista
	IF @CodPresupuesto IS NULL 
	BEGIN
		SET @AUX='No se ha definido un presupuesto para la vigencia '+SUBSTRING(@PeriodoSuperior,1,4)	
		RAISERROR(@AUX,16,1);
		return
	END

	--------------------------
	-- CONSULTA DE INFORMACION
	--------------------------

	-- Obtengo las ejecuciones en Registros HASTA el mes @PeriodoSuperior
	insert into @tablaEjecRegistros
		(CodPresupuesto,CodCentroCosto,CodRubro,VrEjecucion,VrEjecucionMes)
	select 
		 c.CodPresupuesto
		,CASE WHEN cc.CodCentroCostoSuperior IS NULL THEN cc.CodCentroCosto ELSE cc.CodCentroCostoSuperior END
		,c.CodRubro
		,SUM(rid.Valor)
		,SUM(CASE WHEN rid.Periodo=@PeriodoSuperior THEN rid.Valor ELSE 0 END)
	from 
		RegistroINFORDetalle rid
		inner join Compromiso c
			on rid.CodCompromiso=c.CodCompromiso
		inner join CentroCosto cc
			on rid.CentroCosto=cc.CodCentroCosto	
	where
		c.CodPresupuesto=@CodPresupuesto
		and rid.Periodo<=@PeriodoSuperior
		--and cc.CodCentroCosto between @CodCentroCosto_Ini and @CodCentroCosto_Fin
	group by
		 c.CodPresupuesto
		,c.CodRubro
		,(CASE WHEN cc.CodCentroCostoSuperior IS NULL THEN cc.CodCentroCosto ELSE cc.CodCentroCostoSuperior END)--cc.CodCentroCosto
		--,cc.CodCentroCostoSuperior
	order by
		 c.CodPresupuesto
		,(CASE WHEN cc.CodCentroCostoSuperior IS NULL THEN cc.CodCentroCosto ELSE cc.CodCentroCostoSuperior END)--cc.CodCentroCosto
		,c.CodRubro
		--,cc.CodCentroCostoSuperior

	-- Obtengo las ejecuciones en Compromisos HASTA el mes @PeriodoSuperior
	insert into @tablaEjecCompromisos
		(CodPresupuesto,CodCentroCosto,CodRubro,VrEjecucion,VrEjecucionMes)
	select 
		 c.CodPresupuesto
		,CASE WHEN cc.CodCentroCostoSuperior IS NULL THEN cc.CodCentroCosto ELSE cc.CodCentroCostoSuperior END
		,c.CodRubro
		,SUM(c.ValorInicialCompromiso)
		,SUM(CASE WHEN '20'+SUBSTRING(c.CodCompromiso,3,4)=@PeriodoSuperior THEN c.ValorInicialCompromiso ELSE 0 END)
	from 
		Compromiso c
		inner join CentroCosto cc
			on c.CodCentroCosto=cc.CodCentroCosto	
	where
		c.CodPresupuesto=@CodPresupuesto
		and '20'+SUBSTRING(c.CodCompromiso,3,4)<=@PeriodoSuperior
		--and c.CodCentroCosto between @CodCentroCosto_Ini and @CodCentroCosto_Fin
	group by
		 c.CodPresupuesto
		,c.CodRubro
		,(CASE WHEN cc.CodCentroCostoSuperior IS NULL THEN cc.CodCentroCosto ELSE cc.CodCentroCostoSuperior END)--cc.CodCentroCosto
		--,cc.CodCentroCostoSuperior
	order by
		 c.CodPresupuesto
		,(CASE WHEN cc.CodCentroCostoSuperior IS NULL THEN cc.CodCentroCosto ELSE cc.CodCentroCostoSuperior END)--cc.CodCentroCosto
		,c.CodRubro
		--,cc.CodCentroCostoSuperior

--select * from @tablaEjecCompromisos

	-- Obtengo los Movimientos Presupuestales HASTA el mes @PeriodoSuperior
	insert into @tablaMovPresupuestales
		(CodPresupuesto,CodCentroCosto,CodRubro,VrMovimiento)
	SELECT 
		 CodPresupuesto
		,CodCentroCosto
		,CodRubro
		,SUM(Valor) AS Valor
	FROM
		(	
			select 
				 pad.CodPresupuesto
				,pad.CodCentroCosto
				,pad.CodRubro
				,MV1.Valor*-1 AS Valor
			--	,SUM(CASE WHEN '20'+SUBSTRING(c.CodCompromiso,3,4)=@PeriodoSuperior THEN c.ValorInicialCompromiso ELSE 0 END)
			from 
				PresupuestoAnualDetalle pad
				inner join PresupuestoMovimiento MV1
					on	pad.CodPresupuesto=MV1.CodPresupuesto
					and pad.CodCentroCosto=MV1.CodCentroCostoOrigen
					and	pad.CodRubro=MV1.CodRubroOrigen
			WHERE
				MV1.CodPresupuesto=@CodPresupuesto
				and '20'+SUBSTRING(MV1.CodMovimiento,3,4)<=@PeriodoSuperior	
				--and pad.CodCentroCosto between @CodCentroCosto_Ini and @CodCentroCosto_Fin
		UNION 	
			select 
				 pad.CodPresupuesto
				,pad.CodCentroCosto
				,pad.CodRubro
				,MV1.Valor AS Valor
			from 
				PresupuestoAnualDetalle pad
				inner join PresupuestoMovimiento MV1
					on	pad.CodPresupuesto=MV1.CodPresupuesto
					and pad.CodCentroCosto=MV1.CodCentroCostoDestino
					and	pad.CodRubro=MV1.CodRubroDestino
			WHERE
				MV1.CodPresupuesto=@CodPresupuesto
				and '20'+SUBSTRING(MV1.CodMovimiento,3,4)<=@PeriodoSuperior			
				and pad.CodCentroCosto between @CodCentroCosto_Ini and @CodCentroCosto_Fin
		) AS Mvtos
	GROUP BY
		 CodPresupuesto
		,CodCentroCosto
		,CodRubro

	-- Obtengo el detalle del presupuesto
	insert into @tablaDetallePresupuesto
		(CodPresupuesto,CodCentroCosto,CodTipoRubro,CodRubro,VrIniPres_Rubro,NombreCentroCosto,NombreTipoRubro,NombreRubro)
	select 
		 pac.CodPresupuesto
		,pad.CodCentroCosto
		,rt.CodTipo
		,r.CodRubro
		,pad.ValorInicialPresupuesto
		,cc.NombreCentroCosto
		,rt.NombreTipo
		,r.NombreRubro
	from 
		PresupuestoAnualCabecera pac
		inner join PresupuestoAnualDetalle pad
			on	pac.CodPresupuesto=pad.CodPresupuesto
		inner join Rubro r
			on	pad.CodRubro=r.CodRubro
		inner join RubroTipo rt
			on	r.CodTipo=rt.CodTipo
		inner join CentroCosto cc
			on	pad.CodCentroCosto=cc.CodCentroCosto
	where
		pac.CodPresupuesto=@codPresupuesto
		--and pad.CodCentroCosto between @CodCentroCosto_Ini and @CodCentroCosto_Fin		
	ORDER BY
		 pad.CodCentroCosto
		,rt.CodTipo
		,r.CodRubro

	-- Agrego todos los rubros faltantes a cada uno de los centros de costo contenidos en la consulta inmediatamente anterior (en cero obviamente)
	-- Obtengo el detalle del presupuesto
	insert into @tablaDetallePresupuesto
		(CodPresupuesto,CodCentroCosto,CodTipoRubro,CodRubro,VrIniPres_Rubro,NombreCentroCosto,NombreTipoRubro,NombreRubro)
	select 
		 t1.CodPresupuesto
		,t1.CodCentroCosto
		,rt.CodTipo
		,r.CodRubro
		,0 as ValorInicialPresupuesto
		,cc.NombreCentroCosto
		,rt.NombreTipo
		,r.NombreRubro
	from 	
		(
			select 
				 @CodPresupuesto AS CodPresupuesto
				,r.CodRubro
				,r.CodTipo
				,cc.CodCentroCosto
			FROM	
				rubro r
				CROSS JOIN CentroCosto cc
			where	
				r.Activo=1
				and cc.Activo=1
				and cc.CodCentroCostoSuperior is null
		) T1
		INNER JOIN PresupuestoAnualEn3Fases pa3f
			ON T1.CodPresupuesto=pa3f.CodPresupuesto
			and T1.CodRubro=pa3f.CodRubro
		inner join Rubro r
			on	t1.CodRubro=r.CodRubro
		inner join RubroTipo rt
			on	t1.CodTipo=rt.CodTipo
		inner join CentroCosto cc
			on	t1.CodCentroCosto=cc.CodCentroCosto	
		LEFT JOIN  PresupuestoAnualDetalle pad
			ON	T1.CodPresupuesto=pad.CodPresupuesto
			and	T1.CodRubro=pad.CodRubro
			and T1.CodCentroCosto=pad.CodCentroCosto
			and pad.CodPresupuesto=@CodPresupuesto
	where
		pad.CodPresupuesto IS NULL
		--and pad.CodCentroCosto between @CodCentroCosto_Ini and @CodCentroCosto_Fin

	
	
	---------------------------
	-- RECOPILAR LA INFORMACION
	---------------------------
/*
	-- Rubros con presupuesto en CERO
	INSERT INTO ##tablaResultado
	(
		 codPresupuesto
		,CodCentroCosto
		,NombreCentroCosto
		,CodTipoRubro
		,NombreTipoRubro
		,CodRubro
		,NombreRubro
	)
	select 
		-- datos de cabecera
		 res.codPresupuesto
		,res.CodCentroCosto
		,res.NombreCentroCosto
		,res.CodTipoRubro
		,res.NombreTipoRubro
		,res.CodRubro
		,res.NombreRubro
	from 
		@tablaDetallePresupuesto res
		left join @tablaMovPresupuestales Mvtos
			ON  res.CodPresupuesto=Mvtos.CodPresupuesto 
			and res.CodCentroCosto=Mvtos.CodCentroCosto
			and res.CodRubro=Mvtos.CodRubro	
	WHERE
		res.VrIniPres_Rubro+ISNULL(Mvtos.VrMovimiento,0)=0
*/			
	-- Rubros con Presupuesto
	INSERT INTO ##tablaResultado
		(
			 codPresupuesto
			,CodCentroCosto
			,NombreCentroCosto
			,CodTipoRubro
			,NombreTipoRubro
			,CodRubro
			,NombreRubro
			,VrPPTO_Mes
			,VrEjecRegisRubro_Mes
			,PorcCumplimiento_Mes
			-- PRESUPUESTO $
			,VrPPTO_Anio
			-- Analisis Anual (COMPROMISOS)
			,Vr_EjecComprRubro_Anio
			,Porc_EjecCompr_Anio
			,Vr_PorEjecComprRubro_Anio
			,Porc_PorEjecCompr_Anio
			-- Analisis Anual (REGISTROS)
			,Vr_EjecRegisRubro_Anio
			,Porc_EjecRegis_Anio
			,Vr_PorEjecRegisRubro_Anio
			,Porc_PorEjecRegis_Anio
		)
		select 
			-- datos de cabecera
			 res.codPresupuesto
			,res.CodCentroCosto
			,res.NombreCentroCosto
			,res.CodTipoRubro
			,res.NombreTipoRubro
			,res.CodRubro
			,res.NombreRubro
			-- PRESUPUESTO MENSUAL $
			,CONVERT(DECIMAL(18,2),(res.VrIniPres_Rubro+ISNULL(Mvtos.VrMovimiento,0))/12.00) AS VrPPTO_Mes
			-- analisis mensual
			,ISNULL(EjecRegis.VrEjecucionMes,0) AS VrEjecRegisRubro_Mes --,resMes.VrEjec_Rubro AS VrEjecutadoRubro_Mes
			,CASE WHEN res.VrIniPres_Rubro+ISNULL(Mvtos.VrMovimiento,0)<>0 THEN CONVERT(DECIMAL(18,3),ISNULL(EjecRegis.VrEjecucionMes,0)/((res.VrIniPres_Rubro+ISNULL(Mvtos.VrMovimiento,0))/12.00)*100.00) ELSE 0 END AS PorcCumplimiento_Mes
			-- PRESUPUESTO $
			,(res.VrIniPres_Rubro+ISNULL(Mvtos.VrMovimiento,0)) AS VrPPTO_Anio
			-- Analisis Anual (COMPROMISOS)
			,CONVERT(DECIMAL(18,2),ISNULL(EjecCompr.VrEjecucion,0)) AS Vr_EjecComprRubro_Anio
			,CASE WHEN res.VrIniPres_Rubro+ISNULL(Mvtos.VrMovimiento,0)<>0 THEN CONVERT(DECIMAL(18,3),ISNULL(EjecCompr.VrEjecucion,0)/(res.VrIniPres_Rubro+ISNULL(Mvtos.VrMovimiento,0))*100.00) ELSE 0 END AS Porc_EjecCompr_Anio
			,CONVERT(DECIMAL(18,2),(res.VrIniPres_Rubro+ISNULL(Mvtos.VrMovimiento,0))-ISNULL(EjecCompr.VrEjecucion,0)) AS Vr_PorEjecComprRubro_Anio
			,CASE WHEN res.VrIniPres_Rubro+ISNULL(Mvtos.VrMovimiento,0)<>0 THEN CONVERT(DECIMAL(18,3),((res.VrIniPres_Rubro+ISNULL(Mvtos.VrMovimiento,0))-ISNULL(EjecCompr.VrEjecucion,0))/(res.VrIniPres_Rubro+ISNULL(Mvtos.VrMovimiento,0))*100.00) ELSE 0 END AS Porc_PorEjecCompr_Anio
			-- Analisis Anual (REGISTROS)
			,CONVERT(DECIMAL(18,2),ISNULL(EjecRegis.VrEjecucion,0)) AS Vr_EjecRegisRubro_Anio
			,CASE WHEN res.VrIniPres_Rubro+ISNULL(Mvtos.VrMovimiento,0)<>0 THEN CONVERT(DECIMAL(18,3),ISNULL(EjecRegis.VrEjecucion,0)/(res.VrIniPres_Rubro+ISNULL(Mvtos.VrMovimiento,0))*100.00) ELSE 0 END AS Porc_EjecRegis_Anio
			,CONVERT(DECIMAL(18,2),(res.VrIniPres_Rubro+ISNULL(Mvtos.VrMovimiento,0))-ISNULL(EjecRegis.VrEjecucion,0)) AS Vr_PorEjecRegisRubro_Anio
			,CASE WHEN res.VrIniPres_Rubro+ISNULL(Mvtos.VrMovimiento,0)<>0 THEN CONVERT(DECIMAL(18,3),((res.VrIniPres_Rubro+ISNULL(Mvtos.VrMovimiento,0))-ISNULL(EjecRegis.VrEjecucion,0))/(res.VrIniPres_Rubro+ISNULL(Mvtos.VrMovimiento,0))*100.00) ELSE 0 END AS Porc_PorEjecRegis_Anio
			-- ,VrActPres_CCosto
		   --	,*
		from 
			@tablaDetallePresupuesto res
			left join @tablaEjecCompromisos EjecCompr
				ON  res.CodPresupuesto=EjecCompr.CodPresupuesto 
				and res.CodCentroCosto=EjecCompr.CodCentroCosto
				and res.CodRubro=EjecCompr.CodRubro
			left join @tablaEjecRegistros EjecRegis
				ON  res.CodPresupuesto=EjecRegis.CodPresupuesto 
				and res.CodCentroCosto=EjecRegis.CodCentroCosto
				and res.CodRubro=EjecRegis.CodRubro
			left join @tablaMovPresupuestales Mvtos
				ON  res.CodPresupuesto=Mvtos.CodPresupuesto 
				and res.CodCentroCosto=Mvtos.CodCentroCosto
				and res.CodRubro=Mvtos.CodRubro	
		/*WHERE
			res.VrIniPres_Rubro+ISNULL(Mvtos.VrMovimiento,0)<>0
			OR ISNULL(EjecCompr.VrEjecucion,0)<>0
			OR ISNULL(EjecRegis.VrEjecucion,0)<>0
		*/
--select * from ##tablaResultado

RETURN 0
END

--- Si se llega a este punto es porque el @OP indicado no Existe en el Procedimiento Almacenado
IF @OP IS NOT NULL
	BEGIN
	SET @ParamAuxiliar='La Operacion "'+@OP+'" No esta definida en el Procedimiento almacenado "'+OBJECT_NAME(@@PROCID)+'", Revise!.'
	RAISERROR(@ParamAuxiliar,16,1)
	RETURN 1
END

--- CONTROLAR Y REGISTRAR LOS ERRORES
END TRY
BEGIN CATCH
	--- Recopilo la informacion del error
	DECLARE @ERROR_NUMBER INT=ERROR_NUMBER(),@ERROR_SEVERITY INT=ERROR_SEVERITY(),@ERROR_STATE INT=ERROR_STATE(),@ERROR_PROCEDURE VARCHAR(128)=ERROR_PROCEDURE(),@ERROR_LINE INT=ERROR_LINE(),@ERROR_MESSAGE VARCHAR(2048)=ERROR_MESSAGE()
	--- Si hay transacciones abiertas, hago un rollback, SE ENCIERRA EN UN (TRY-CATCH) PARA QUE NO SE MUESTRE EL ERROR: Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT
	IF(@@TRANCOUNT>0) BEGIN BEGIN TRY ROLLBACK TRANSACTION END TRY BEGIN CATCH END CATCH END
	--- Ejecuto el SP que controla y registra el error
	EXEC [spSeguridadMessageException] @OP='MostrarMensaje',@ERROR_NUMBER=@ERROR_NUMBER,@ERROR_SEVERITY=@ERROR_SEVERITY,@ERROR_STATE=@ERROR_STATE,@ERROR_PROCEDURE=@ERROR_PROCEDURE,@ERROR_LINE=@ERROR_LINE,@ERROR_MESSAGE=@ERROR_MESSAGE
	RETURN 1
END CATCH;
